#include "algoritmos.h"

long bmhsLinha(char *linha, char *padrao, int numLinha, int erro, int* ocorrencias) {
  int tamLinha = strlen(linha);
  int tamPadrao = strlen(padrao);
  *ocorrencias = 0;
  
  long i, j, k;
  
  long d[MAX_CHAR+1];
  

  long comp=0;
  
  // Pre-processamento
  
  for (i=0; i<=MAX_CHAR; i++) {
      d[i] = tamPadrao + 1;
  }
  
  // inicializa as 'tamPadrao' casas do vetor com:
  // tamPadrao, tamPadrao - 1, tamPadrao - 2, ..., 2, 1
  for (i=1; i<=tamPadrao; i++) {
      d[(int)padrao[i-1]] = tamPadrao - i + 1;
  }
  
  
  // busca
  
  i = tamPadrao;
  while (i<=tamLinha) {
      k = i;
      j = tamPadrao;
      while (linha[k-1] == padrao[j-1] && j>0) { 
          k--; 
          j--;
          // conta o numero de comparacoes
          comp++;
      }
      if (j==0) {
          if (!ANALISE) imprimeResultado(linha, padrao, numLinha, k+1);
          (*ocorrencias)++;
      }
        
      i += d[(int)linha[i]];
  }
  
  return comp;
}


long bmhsTexto(char **texto, char *padrao, int nLinhasTexto, int linhaInicial, int erro, float* tempo, int* ocorrencias) {

    long comparacoes = 0;
    int i=0;
    int ocorrenciasLinha = 0;
    *ocorrencias = 0;

    clock_t inicio, fim;
    inicio = clock();
    
    for (i=0; i<nLinhasTexto; i++) {
        char *linha = texto[i];
        comparacoes += bmhsLinha(linha, padrao, linhaInicial, erro, &ocorrenciasLinha);
        linhaInicial++;
        *ocorrencias += ocorrenciasLinha;
    }

    
    fim = clock();
    *tempo = ( (float)fim -(float)inicio ) / ( (float)CLOCKS_PER_SEC );
    //printf("tempo=%d\n", tempo);
    
    return comparacoes;
}
